Autogenerated HTML docs for v2.9.0-243-g5c589 
diff --git a/RelNotes/2.10.0.txt b/RelNotes/2.10.0.txt index 63499b7..3853b3d 100644 --- a/RelNotes/2.10.0.txt +++ b/RelNotes/2.10.0.txt 
@@ -28,6 +28,34 @@  that they are shown with "remote: " prefix to avoid confusing the  users.   + * "git add -i/-p" learned to honor diff.compactionHeuristic + experimental knob, so that the user can work on the same hunk split + as "git diff" output. + (merge 46e3d17 jk/add-i-diff-compact-heuristics later to maint). + + * "upload-pack" allows a custom "git pack-objects" replacement when + responding to "fetch/clone" via the uploadpack.packObjectsHook. + (merge 20b20a2 jk/upload-pack-hook later to maint). + + * Teach format-patch and mailsplit (hence "am") how a line that + happens to begin with "From " in the e-mail message is quoted with + ">", so that these lines can be restored to their original shape. + (merge d9925d1 ew/mboxrd-format-am later to maint). + + * "git repack" learned the "--keep-unreachable" option, which sends + loose unreachable objects to a pack instead of leaving them loose. + This helps heuristics based on the number of loose objects + (e.g. "gc --auto"). + (merge e26a8c4 jk/repack-keep-unreachable later to maint). + + * "log --graph --format=" learned that "%>|(N)" specifies the width + relative to the terminal's left edge, not relative to the area to + draw text that is to the right of the ancestry-graph section. It + also now accepts negative N that means the column limit is relative + to the right border. + (merge 066790d nd/graph-width-padded later to maint). + +  Performance, Internal Implementation, Development Support etc.    * "git fast-import" learned the same performance trick to avoid @@ -48,6 +76,46 @@  be explicitly (re)initialized to make the machinery callable more  than once.   + * HTTP transport gained an option to produce more detailed debugging + trace. + (merge 73e57aa ep/http-curl-trace later to maint). + + * Instead of taking advantage of a struct string_list that is + allocated with all NULs happens to be STRING_LIST_INIT_NODUP kind, + initialize them explicitly as such, to document their behaviour + better. + (merge 2721ce2 jk/string-list-static-init later to maint). + + * HTTPd tests learned to show the server error log to help diagnosing + a failing tests. + (merge 44f243d nd/test-lib-httpd-show-error-log-in-verbose later to maint). + + * The ownership rule for the piece of memory that hold references to + be fetched in "git fetch" was screwy, which has been cleaned up. + (merge b7410f6 km/fetch-do-not-free-remote-name later to maint). + + * "git bisect" makes an internal call to "git diff-tree" when + bisection finds the culprit, but this call did not initialize the + data structure to pass to the diff-tree API correctly. + (merge 43ec550 jk/bisect-show-tree later to maint). + + * Further preparatory clean-up for "worktree" feature continues. + (merge 0409e0b nd/worktree-cleanup-post-head-protection later to maint). + + * Formats of the various data (and how to validate them) where we use + GPG signature have been documented. + (merge cc6ee97 mg/signature-doc later to maint). + + * A new run-command API function pipe_command() is introduced to + sanely feed data to the standard input while capturing data from + the standard output and the standard error of an external process, + which is cumbersome to hand-roll correctly without deadlocking. + + The codepath to sign data in a prepared buffer with GPG has been + updated to use this API to read from the status-fd to check for + errors (instead of relying on GPG's exit status). + (merge efee955 jk/gpg-interface-cleanup later to maint). +    Also contains various documentation updates and code clean-ups.   @@ -80,54 +148,81 @@  * The documentation set has been updated so that literal commands,  configuration variables and environment variables are consistently  typeset in fixed-width font and bold in manpages. - (merge ae9f631 tr/doc-tt later to maint).    * "git svn propset" subcommand that was added in 2.3 days is  documented now. - (merge 19a7f24 ap/git-svn-propset-doc later to maint).    * The documentation tries to consistently spell "GPG"; when  referring to the specific program name, "gpg" is used. - (merge bc91316 dn/gpg-doc later to maint).    * "git reflog" stopped upon seeing an entry that denotes a branch  creation event (aka "unborn"), which made it appear as if the  reflog was truncated. - (merge 71abeb7 sg/reflog-past-root later to maint).    * The git-prompt scriptlet (in contrib/) was not friendly with those  who uses "set -u", which has been fixed. - (merge 34d8f5a vs/prompt-avoid-unset-variable later to maint).    * compat/regex code did not cleanly compile. - (merge bd8f005 rj/compat-regex-size-max-fix later to maint).    * A codepath that used alloca(3) to place an unbounded amount of data  on the stack has been updated to avoid doing so. - (merge b8ba412 jk/avoid-unbounded-alloca later to maint).    * "git update-index --add --chmod=+x file" may be usable as an escape  hatch, but not a friendly thing to force for people who do need to  use it regularly. "git add --chmod=+x file" can be used instead. - (merge 4e55ed3 et/add-chmod-x later to maint).    * Build improvements for gnome-keyring (in contrib/) - (merge 3cddb00 nb/gnome-keyring-build later to maint).    * "git status" used to say "working directory" when it meant "working  tree". - (merge 2a0e6cd lv/status-say-working-tree-not-directory later to maint).    * Comments about misbehaving FreeBSD shells have been clarified with  the version number (9.x and before are broken, newer ones are OK). - (merge 9b35cad em/newer-freebsd-shells-are-fine-with-returns later to maint).    * "git cherry-pick A" worked on an unborn branch, but "git  cherry-pick A..B" didn't. - (merge 0f974e2 mg/cherry-pick-multi-on-unborn later to maint). + + * Fix an unintended regression in v2.9 that breaks "clone --depth" + that recurses down to submodules by forcing the submodules to also + be cloned shallowly, which many server instances that host upstream + of the submodules are not prepared for. + (merge 18a74a0 sb/clone-shallow-passthru later to maint). + + * Fix unnecessarily waste in the idiomatic use of ': ${VAR=default}' + to set the default value, without enclosing it in double quotes. + (merge 01247e0 lc/shell-default-value-noexpand later to maint). + + * Some platform-specific code had non-ANSI strict declarations of C + functions that do not take any parameters, which has been + corrected. + (merge 0767172 js/mingw-parameter-less-c-functions later to maint). + + * The internal code used to show local timezone offset is not + prepared to handle timestamps beyond year 2100, and gave a + bogus offset value to the caller. Use a more benign looking + +0000 instead and let "git log" going in such a case, instead + of aborting. + (merge bab7483 jk/tzoffset-fix later to maint). + + * One among four invocations of readlink(1) in our test suite has + been rewritten so that the test can run on systems without the + command (others are in valgrind test framework and t9802). + (merge d2addc3 ak/t7800-wo-readlink later to maint). + + * t/perf needs /usr/bin/time with GNU extension; the invocation of it + is updated to "gtime" on Darwin. + (merge e3efa94 js/perf-on-apple later to maint). + + * A bug, which caused "git p4" while running under verbose mode to + report paths that are omitted due to branch prefix incorrectly, has + been fixed; the command said "Ignoring file outside of prefix" for + paths that are _inside_. + (merge 09667d0 ao/p4-has-branch-prefix-fix later to maint).    * Other minor clean-ups and documentation updates - (merge 3a39f61 pc/occurred later to maint). - (merge 9e70233 jk/fetch-prune-doc later to maint). - (merge ed008d7 pb/strbuf-read-file-doc later to maint). - (merge 31da121 jc/deref-tag later to maint). + (merge e51b0df pb/commit-editmsg-path later to maint). + (merge b333d0d jk/send-pack-stdio later to maint). + (merge fcf0fe9 lf/sideband-returns-void later to maint). + (merge 5819c2e sb/t5614-modernize later to maint). + (merge fe0537a cb/t7810-test-label-fix later to maint). + (merge 412b9a1 jc/t2300-setup later to maint). 
diff --git a/RelNotes/2.9.1.txt b/RelNotes/2.9.1.txt index ed2bca0..369383b 100644 --- a/RelNotes/2.9.1.txt +++ b/RelNotes/2.9.1.txt 
@@ -24,5 +24,39 @@  file when a change added an entire function at the end of the file,  which has been fixed.   + * The documentation set has been updated so that literal commands, + configuration variables and environment variables are consistently + typeset in fixed-width font and bold in manpages. + + * "git svn propset" subcommand that was added in 2.3 days is + documented now. + + * The documentation tries to consistently spell "GPG"; when + referring to the specific program name, "gpg" is used. + + * "git reflog" stopped upon seeing an entry that denotes a branch + creation event (aka "unborn"), which made it appear as if the + reflog was truncated. + + * The git-prompt scriptlet (in contrib/) was not friendly with those + who uses "set -u", which has been fixed. + + * A codepath that used alloca(3) to place an unbounded amount of data + on the stack has been updated to avoid doing so. + + * "git update-index --add --chmod=+x file" may be usable as an escape + hatch, but not a friendly thing to force for people who do need to + use it regularly. "git add --chmod=+x file" can be used instead. + + * Build improvements for gnome-keyring (in contrib/) + + * "git status" used to say "working directory" when it meant "working + tree". + + * Comments about misbehaving FreeBSD shells have been clarified with + the version number (9.x and before are broken, newer ones are OK). + + * "git cherry-pick A" worked on an unborn branch, but "git + cherry-pick A..B" didn't.    Also contains minor documentation updates and code clean-ups. 
diff --git a/config.txt b/config.txt index 626243f..e208af1 100644 --- a/config.txt +++ b/config.txt 
@@ -2892,6 +2892,21 @@ 	`uploadpack.keepAlive` seconds. Setting this option to 0 	disables keepalive packets entirely. The default is 5 seconds.   +uploadpack.packObjectsHook:: +	If this option is set, when `upload-pack` would run +	`git pack-objects` to create a packfile for a client, it will +	run this shell command instead. The `pack-objects` command and +	arguments it _would_ have run (including the `git pack-objects` +	at the beginning) are appended to the shell command. The stdin +	and stdout of the hook are treated as if `pack-objects` itself +	was run. I.e., `upload-pack` will feed input intended for +	`pack-objects` to the hook, and expects a completed packfile on +	stdout. ++ +Note that this configuration variable is ignored if it is seen in the +repository-level config (this is a safety measure against fetching from +untrusted repositories). +  url.<base>.insteadOf:: 	Any URL that starts with this value will be rewritten to 	start, instead, with <base>. In cases where some site serves a 
diff --git a/git-am.html b/git-am.html index 43a1ffa..2098f92 100644 --- a/git-am.html +++ b/git-am.html 
@@ -967,7 +967,8 @@  By default the command will try to detect the patch format   automatically. This option allows the user to bypass the automatic   detection and specify the patch format that the patch(es) should be  - interpreted as. Valid formats are mbox, stgit, stgit-series and hg.  + interpreted as. Valid formats are mbox, mboxrd,  + stgit, stgit-series and hg.   </p>   </dd>   <dt class="hdlist1">  @@ -1158,7 +1159,7 @@  <div id="footnotes"><hr /></div>   <div id="footer">   <div id="footer-text">  -Last updated 2016-01-20 15:22:32 PST  +Last updated 2016-07-06 14:33:48 PDT   </div>   </div>   </body>  
diff --git a/git-am.txt b/git-am.txt index 13cdd7f..6348c29 100644 --- a/git-am.txt +++ b/git-am.txt 
@@ -116,7 +116,8 @@ 	By default the command will try to detect the patch format 	automatically. This option allows the user to bypass the automatic 	detection and specify the patch format that the patch(es) should be -	interpreted as. Valid formats are mbox, stgit, stgit-series and hg. +	interpreted as. Valid formats are mbox, mboxrd, +	stgit, stgit-series and hg.    -i::  --interactive:: 
diff --git a/git-clone.html b/git-clone.html index 0906f2d..1c88116 100644 --- a/git-clone.html +++ b/git-clone.html 
@@ -1030,9 +1030,8 @@  Create a <em>shallow</em> clone with a history truncated to the   specified number of commits. Implies <code>--single-branch</code> unless   <code>--no-single-branch</code> is given to fetch the histories near the  - tips of all branches. This implies <code>--shallow-submodules</code>. If  - you want to have a shallow superproject clone, but full submodules,  - also pass <code>--no-shallow-submodules</code>.  + tips of all branches. If you want to clone submodules shallowly,  + also pass <code>--shallow-submodules</code>.   </p>   </dd>   <dt class="hdlist1">  @@ -1315,7 +1314,7 @@  <div id="footnotes"><hr /></div>   <div id="footer">   <div id="footer-text">  -Last updated 2016-05-06 15:26:51 PDT  +Last updated 2016-07-06 14:33:48 PDT   </div>   </div>   </body>  
diff --git a/git-clone.txt b/git-clone.txt index 1b15cd7..ec41d3d 100644 --- a/git-clone.txt +++ b/git-clone.txt 
@@ -191,9 +191,8 @@ 	Create a 'shallow' clone with a history truncated to the 	specified number of commits. Implies `--single-branch` unless 	`--no-single-branch` is given to fetch the histories near the -	tips of all branches. This implies `--shallow-submodules`. If -	you want to have a shallow superproject clone, but full submodules, -	also pass `--no-shallow-submodules`. +	tips of all branches. If you want to clone submodules shallowly, +	also pass `--shallow-submodules`.    --[no-]single-branch:: 	Clone only the history leading to the tip of a single branch, 
diff --git a/git-config.html b/git-config.html index d8012df..77d8532 100644 --- a/git-config.html +++ b/git-config.html 
@@ -7029,6 +7029,25 @@  </p>   </dd>   <dt class="hdlist1">  +uploadpack.packObjectsHook  +</dt>  +<dd>  +<p>  + If this option is set, when <code>upload-pack</code> would run  + <code>git pack-objects</code> to create a packfile for a client, it will  + run this shell command instead. The <code>pack-objects</code> command and  + arguments it <em>would</em> have run (including the <code>git pack-objects</code>  + at the beginning) are appended to the shell command. The stdin  + and stdout of the hook are treated as if <code>pack-objects</code> itself  + was run. I.e., <code>upload-pack</code> will feed input intended for  + <code>pack-objects</code> to the hook, and expects a completed packfile on  + stdout.  +</p>  +<div class="paragraph"><p>Note that this configuration variable is ignored if it is seen in the  +repository-level config (this is a safety measure against fetching from  +untrusted repositories).</p></div>  +</dd>  +<dt class="hdlist1">   url.&lt;base&gt;.insteadOf   </dt>   <dd>  
diff --git a/git-mailsplit.html b/git-mailsplit.html index 5624411..95167e5 100644 --- a/git-mailsplit.html +++ b/git-mailsplit.html 
@@ -748,7 +748,8 @@  <h2 id="_synopsis">SYNOPSIS</h2>   <div class="sectionbody">   <div class="verseblock">  -<pre class="content"><em>git mailsplit</em> [-b] [-f&lt;nn&gt;] [-d&lt;prec&gt;] [--keep-cr] -o&lt;directory&gt; [--] [(&lt;mbox&gt;|&lt;Maildir&gt;)&#8230;]</pre>  +<pre class="content"><em>git mailsplit</em> [-b] [-f&lt;nn&gt;] [-d&lt;prec&gt;] [--keep-cr] [--mboxrd]  + -o&lt;directory&gt; [--] [(&lt;mbox&gt;|&lt;Maildir&gt;)&#8230;]</pre>   <div class="attribution">   </div></div>   </div>  @@ -835,6 +836,15 @@  Do not remove <code>\r</code> from lines ending with <code>\r\n</code>.   </p>   </dd>  +<dt class="hdlist1">  +--mboxrd  +</dt>  +<dd>  +<p>  + Input is of the "mboxrd" format and "^&gt;+From " line escaping is  + reversed.  +</p>  +</dd>   </dl></div>   </div>   </div>  @@ -848,7 +858,7 @@  <div id="footnotes"><hr /></div>   <div id="footer">   <div id="footer-text">  -Last updated 2013-08-20 08:40:27 PDT  +Last updated 2016-07-06 14:33:48 PDT   </div>   </div>   </body>  
diff --git a/git-mailsplit.txt b/git-mailsplit.txt index 4d1b871..e3b2a88 100644 --- a/git-mailsplit.txt +++ b/git-mailsplit.txt 
@@ -8,7 +8,8 @@  SYNOPSIS  --------  [verse] -'git mailsplit' [-b] [-f<nn>] [-d<prec>] [--keep-cr] -o<directory> [--] [(<mbox>|<Maildir>)...] +'git mailsplit' [-b] [-f<nn>] [-d<prec>] [--keep-cr] [--mboxrd] +	-o<directory> [--] [(<mbox>|<Maildir>)...]    DESCRIPTION  ----------- @@ -47,6 +48,10 @@  --keep-cr:: 	Do not remove `\r` from lines ending with `\r\n`.   +--mboxrd:: +	Input is of the "mboxrd" format and "^>+From " line escaping is +	reversed. +  GIT  ---  Part of the linkgit:git[1] suite 
diff --git a/git-repack.html b/git-repack.html index e0935d2..13a78c2 100644 --- a/git-repack.html +++ b/git-repack.html 
@@ -938,6 +938,31 @@  bitmapped packfile has the necessary objects.   </p>   </dd>  +<dt class="hdlist1">  +--unpack-unreachable=&lt;when&gt;  +</dt>  +<dd>  +<p>  + When loosening unreachable objects, do not bother loosening any  + objects older than <code>&lt;when&gt;</code>. This can be used to optimize out  + the write of any objects that would be immediately pruned by  + a follow-up <code>git prune</code>.  +</p>  +</dd>  +<dt class="hdlist1">  +-k  +</dt>  +<dt class="hdlist1">  +--keep-unreachable  +</dt>  +<dd>  +<p>  + When used with <code>-ad</code>, any unreachable objects from existing  + packs will be appended to the end of the packfile instead of  + being removed. In addition, any unreachable loose objects will  + be packed (and their loose counterparts removed).  +</p>  +</dd>   </dl></div>   </div>   </div>  @@ -972,7 +997,7 @@  <div id="footnotes"><hr /></div>   <div id="footer">   <div id="footer-text">  -Last updated 2016-05-10 14:23:36 PDT  +Last updated 2016-07-06 14:33:48 PDT   </div>   </div>   </body>  
diff --git a/git-repack.txt b/git-repack.txt index b9c02ce..b58b6b5 100644 --- a/git-repack.txt +++ b/git-repack.txt 
@@ -128,6 +128,19 @@ 	with `-b` or `repack.writeBitmaps`, as it ensures that the 	bitmapped packfile has the necessary objects.   +--unpack-unreachable=<when>:: +	When loosening unreachable objects, do not bother loosening any +	objects older than `<when>`. This can be used to optimize out +	the write of any objects that would be immediately pruned by +	a follow-up `git prune`. + +-k:: +--keep-unreachable:: +	When used with `-ad`, any unreachable objects from existing +	packs will be appended to the end of the packfile instead of +	being removed. In addition, any unreachable loose objects will +	be packed (and their loose counterparts removed). +  Configuration  -------------   
diff --git a/git-worktree.html b/git-worktree.html index 99df553..6583afd 100644 --- a/git-worktree.html +++ b/git-worktree.html 
@@ -749,8 +749,8 @@  <div class="sectionbody">   <div class="verseblock">   <pre class="content"><em>git worktree add</em> [-f] [--detach] [--checkout] [-b &lt;new-branch&gt;] &lt;path&gt; [&lt;branch&gt;]  -<em>git worktree prune</em> [-n] [-v] [--expire &lt;expire&gt;]  -<em>git worktree list</em> [--porcelain]</pre>  +<em>git worktree list</em> [--porcelain]  +<em>git worktree prune</em> [-n] [-v] [--expire &lt;expire&gt;]</pre>   <div class="attribution">   </div></div>   </div>  @@ -800,14 +800,6 @@  as if <code>-b $(basename &lt;path&gt;)</code> was specified.</p></div>   </dd>   <dt class="hdlist1">  -prune  -</dt>  -<dd>  -<p>  -Prune working tree information in $GIT_DIR/worktrees.  -</p>  -</dd>  -<dt class="hdlist1">   list   </dt>   <dd>  @@ -818,6 +810,14 @@  (or <em>detached HEAD</em> if none).   </p>   </dd>  +<dt class="hdlist1">  +prune  +</dt>  +<dd>  +<p>  +Prune working tree information in $GIT_DIR/worktrees.  +</p>  +</dd>   </dl></div>   </div>   </div>  @@ -1061,7 +1061,7 @@  <div id="footnotes"><hr /></div>   <div id="footer">   <div id="footer-text">  -Last updated 2016-06-20 14:23:22 PDT  +Last updated 2016-07-06 14:33:48 PDT   </div>   </div>   </body>  
diff --git a/git-worktree.txt b/git-worktree.txt index 23d8d2a..7c4cfb0 100644 --- a/git-worktree.txt +++ b/git-worktree.txt 
@@ -10,8 +10,8 @@  --------  [verse]  'git worktree add' [-f] [--detach] [--checkout] [-b <new-branch>] <path> [<branch>] -'git worktree prune' [-n] [-v] [--expire <expire>]  'git worktree list' [--porcelain] +'git worktree prune' [-n] [-v] [--expire <expire>]    DESCRIPTION  ----------- @@ -55,10 +55,6 @@  then, as a convenience, a new branch based at HEAD is created automatically,  as if `-b $(basename <path>)` was specified.   -prune:: - -Prune working tree information in $GIT_DIR/worktrees. -  list::    List details of each worktree. The main worktree is listed first, followed by @@ -66,6 +62,10 @@  bare, the revision currently checked out, and the branch currently checked out  (or 'detached HEAD' if none).   +prune:: + +Prune working tree information in $GIT_DIR/worktrees. +  OPTIONS  -------   
diff --git a/git.html b/git.html index ca58e30..b3721a4 100644 --- a/git.html +++ b/git.html 
@@ -2806,6 +2806,19 @@  </p>   </dd>   <dt class="hdlist1">  +<code>GIT_TRACE_CURL</code>  +</dt>  +<dd>  +<p>  + Enables a curl full trace dump of all incoming and outgoing data,  + including descriptive information, of the git transport protocol.  + This is similar to doing curl <code>--trace-ascii</code> on the command line.  + This option overrides setting the <code>GIT_CURL_VERBOSE</code> environment  + variable.  + See <code>GIT_TRACE</code> for available trace output options.  +</p>  +</dd>  +<dt class="hdlist1">   <code>GIT_LITERAL_PATHSPECS</code>   </dt>   <dd>  @@ -3032,7 +3045,7 @@  <div id="footnotes"><hr /></div>   <div id="footer">   <div id="footer-text">  -Last updated 2016-06-27 11:04:05 PDT  +Last updated 2016-07-06 14:33:48 PDT   </div>   </div>   </body>  
diff --git a/git.txt b/git.txt index b0611ea..ca611c9 100644 --- a/git.txt +++ b/git.txt 
@@ -1083,6 +1083,14 @@ 	cloning of shallow repositories. 	See `GIT_TRACE` for available trace output options.   +`GIT_TRACE_CURL`:: +	Enables a curl full trace dump of all incoming and outgoing data, +	including descriptive information, of the git transport protocol. +	This is similar to doing curl `--trace-ascii` on the command line. +	This option overrides setting the `GIT_CURL_VERBOSE` environment +	variable. +	See `GIT_TRACE` for available trace output options. +  `GIT_LITERAL_PATHSPECS`:: 	Setting this variable to `1` will cause Git to treat all 	pathspecs literally, rather than as glob patterns. For example, 
diff --git a/technical/signature-format.html b/technical/signature-format.html new file mode 100644 index 0000000..d6ac673 --- /dev/null +++ b/technical/signature-format.html 
@@ -0,0 +1,1002 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"  + "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">  +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">  +<head>  +<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />  +<meta name="generator" content="AsciiDoc 8.6.9" />  +<title>Git signature format</title>  +<style type="text/css">  +/* Shared CSS for AsciiDoc xhtml11 and html5 backends */  +  +/* Default font. */  +body {  + font-family: Georgia,serif;  +}  +  +/* Title font. */  +h1, h2, h3, h4, h5, h6,  +div.title, caption.title,  +thead, p.table.header,  +#toctitle,  +#author, #revnumber, #revdate, #revremark,  +#footer {  + font-family: Arial,Helvetica,sans-serif;  +}  +  +body {  + margin: 1em 5% 1em 5%;  +}  +  +a {  + color: blue;  + text-decoration: underline;  +}  +a:visited {  + color: fuchsia;  +}  +  +em {  + font-style: italic;  + color: navy;  +}  +  +strong {  + font-weight: bold;  + color: #083194;  +}  +  +h1, h2, h3, h4, h5, h6 {  + color: #527bbd;  + margin-top: 1.2em;  + margin-bottom: 0.5em;  + line-height: 1.3;  +}  +  +h1, h2, h3 {  + border-bottom: 2px solid silver;  +}  +h2 {  + padding-top: 0.5em;  +}  +h3 {  + float: left;  +}  +h3 + * {  + clear: left;  +}  +h5 {  + font-size: 1.0em;  +}  +  +div.sectionbody {  + margin-left: 0;  +}  +  +hr {  + border: 1px solid silver;  +}  +  +p {  + margin-top: 0.5em;  + margin-bottom: 0.5em;  +}  +  +ul, ol, li > p {  + margin-top: 0;  +}  +ul > li { color: #aaa; }  +ul > li > * { color: black; }  +  +.monospaced, code, pre {  + font-family: "Courier New", Courier, monospace;  + font-size: inherit;  + color: navy;  + padding: 0;  + margin: 0;  +}  +pre {  + white-space: pre-wrap;  +}  +  +#author {  + color: #527bbd;  + font-weight: bold;  + font-size: 1.1em;  +}  +#email {  +}  +#revnumber, #revdate, #revremark {  +}  +  +#footer {  + font-size: small;  + border-top: 2px solid silver;  + padding-top: 0.5em;  + margin-top: 4.0em;  +}  +#footer-text {  + float: left;  + padding-bottom: 0.5em;  +}  +#footer-badges {  + float: right;  + padding-bottom: 0.5em;  +}  +  +#preamble {  + margin-top: 1.5em;  + margin-bottom: 1.5em;  +}  +div.imageblock, div.exampleblock, div.verseblock,  +div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,  +div.admonitionblock {  + margin-top: 1.0em;  + margin-bottom: 1.5em;  +}  +div.admonitionblock {  + margin-top: 2.0em;  + margin-bottom: 2.0em;  + margin-right: 10%;  + color: #606060;  +}  +  +div.content { /* Block element content. */  + padding: 0;  +}  +  +/* Block element titles. */  +div.title, caption.title {  + color: #527bbd;  + font-weight: bold;  + text-align: left;  + margin-top: 1.0em;  + margin-bottom: 0.5em;  +}  +div.title + * {  + margin-top: 0;  +}  +  +td div.title:first-child {  + margin-top: 0.0em;  +}  +div.content div.title:first-child {  + margin-top: 0.0em;  +}  +div.content + div.title {  + margin-top: 0.0em;  +}  +  +div.sidebarblock > div.content {  + background: #ffffee;  + border: 1px solid #dddddd;  + border-left: 4px solid #f0f0f0;  + padding: 0.5em;  +}  +  +div.listingblock > div.content {  + border: 1px solid #dddddd;  + border-left: 5px solid #f0f0f0;  + background: #f8f8f8;  + padding: 0.5em;  +}  +  +div.quoteblock, div.verseblock {  + padding-left: 1.0em;  + margin-left: 1.0em;  + margin-right: 10%;  + border-left: 5px solid #f0f0f0;  + color: #888;  +}  +  +div.quoteblock > div.attribution {  + padding-top: 0.5em;  + text-align: right;  +}  +  +div.verseblock > pre.content {  + font-family: inherit;  + font-size: inherit;  +}  +div.verseblock > div.attribution {  + padding-top: 0.75em;  + text-align: left;  +}  +/* DEPRECATED: Pre version 8.2.7 verse style literal block. */  +div.verseblock + div.attribution {  + text-align: left;  +}  +  +div.admonitionblock .icon {  + vertical-align: top;  + font-size: 1.1em;  + font-weight: bold;  + text-decoration: underline;  + color: #527bbd;  + padding-right: 0.5em;  +}  +div.admonitionblock td.content {  + padding-left: 0.5em;  + border-left: 3px solid #dddddd;  +}  +  +div.exampleblock > div.content {  + border-left: 3px solid #dddddd;  + padding-left: 0.5em;  +}  +  +div.imageblock div.content { padding-left: 0; }  +span.image img { border-style: none; vertical-align: text-bottom; }  +a.image:visited { color: white; }  +  +dl {  + margin-top: 0.8em;  + margin-bottom: 0.8em;  +}  +dt {  + margin-top: 0.5em;  + margin-bottom: 0;  + font-style: normal;  + color: navy;  +}  +dd > *:first-child {  + margin-top: 0.1em;  +}  +  +ul, ol {  + list-style-position: outside;  +}  +ol.arabic {  + list-style-type: decimal;  +}  +ol.loweralpha {  + list-style-type: lower-alpha;  +}  +ol.upperalpha {  + list-style-type: upper-alpha;  +}  +ol.lowerroman {  + list-style-type: lower-roman;  +}  +ol.upperroman {  + list-style-type: upper-roman;  +}  +  +div.compact ul, div.compact ol,  +div.compact p, div.compact p,  +div.compact div, div.compact div {  + margin-top: 0.1em;  + margin-bottom: 0.1em;  +}  +  +tfoot {  + font-weight: bold;  +}  +td > div.verse {  + white-space: pre;  +}  +  +div.hdlist {  + margin-top: 0.8em;  + margin-bottom: 0.8em;  +}  +div.hdlist tr {  + padding-bottom: 15px;  +}  +dt.hdlist1.strong, td.hdlist1.strong {  + font-weight: bold;  +}  +td.hdlist1 {  + vertical-align: top;  + font-style: normal;  + padding-right: 0.8em;  + color: navy;  +}  +td.hdlist2 {  + vertical-align: top;  +}  +div.hdlist.compact tr {  + margin: 0;  + padding-bottom: 0;  +}  +  +.comment {  + background: yellow;  +}  +  +.footnote, .footnoteref {  + font-size: 0.8em;  +}  +  +span.footnote, span.footnoteref {  + vertical-align: super;  +}  +  +#footnotes {  + margin: 20px 0 20px 0;  + padding: 7px 0 0 0;  +}  +  +#footnotes div.footnote {  + margin: 0 0 5px 0;  +}  +  +#footnotes hr {  + border: none;  + border-top: 1px solid silver;  + height: 1px;  + text-align: left;  + margin-left: 0;  + width: 20%;  + min-width: 100px;  +}  +  +div.colist td {  + padding-right: 0.5em;  + padding-bottom: 0.3em;  + vertical-align: top;  +}  +div.colist td img {  + margin-top: 0.3em;  +}  +  +@media print {  + #footer-badges { display: none; }  +}  +  +#toc {  + margin-bottom: 2.5em;  +}  +  +#toctitle {  + color: #527bbd;  + font-size: 1.1em;  + font-weight: bold;  + margin-top: 1.0em;  + margin-bottom: 0.1em;  +}  +  +div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {  + margin-top: 0;  + margin-bottom: 0;  +}  +div.toclevel2 {  + margin-left: 2em;  + font-size: 0.9em;  +}  +div.toclevel3 {  + margin-left: 4em;  + font-size: 0.9em;  +}  +div.toclevel4 {  + margin-left: 6em;  + font-size: 0.9em;  +}  +  +span.aqua { color: aqua; }  +span.black { color: black; }  +span.blue { color: blue; }  +span.fuchsia { color: fuchsia; }  +span.gray { color: gray; }  +span.green { color: green; }  +span.lime { color: lime; }  +span.maroon { color: maroon; }  +span.navy { color: navy; }  +span.olive { color: olive; }  +span.purple { color: purple; }  +span.red { color: red; }  +span.silver { color: silver; }  +span.teal { color: teal; }  +span.white { color: white; }  +span.yellow { color: yellow; }  +  +span.aqua-background { background: aqua; }  +span.black-background { background: black; }  +span.blue-background { background: blue; }  +span.fuchsia-background { background: fuchsia; }  +span.gray-background { background: gray; }  +span.green-background { background: green; }  +span.lime-background { background: lime; }  +span.maroon-background { background: maroon; }  +span.navy-background { background: navy; }  +span.olive-background { background: olive; }  +span.purple-background { background: purple; }  +span.red-background { background: red; }  +span.silver-background { background: silver; }  +span.teal-background { background: teal; }  +span.white-background { background: white; }  +span.yellow-background { background: yellow; }  +  +span.big { font-size: 2em; }  +span.small { font-size: 0.6em; }  +  +span.underline { text-decoration: underline; }  +span.overline { text-decoration: overline; }  +span.line-through { text-decoration: line-through; }  +  +div.unbreakable { page-break-inside: avoid; }  +  +  +/*  + * xhtml11 specific  + *  + * */  +  +div.tableblock {  + margin-top: 1.0em;  + margin-bottom: 1.5em;  +}  +div.tableblock > table {  + border: 3px solid #527bbd;  +}  +thead, p.table.header {  + font-weight: bold;  + color: #527bbd;  +}  +p.table {  + margin-top: 0;  +}  +/* Because the table frame attribute is overriden by CSS in most browsers. */  +div.tableblock > table[frame="void"] {  + border-style: none;  +}  +div.tableblock > table[frame="hsides"] {  + border-left-style: none;  + border-right-style: none;  +}  +div.tableblock > table[frame="vsides"] {  + border-top-style: none;  + border-bottom-style: none;  +}  +  +  +/*  + * html5 specific  + *  + * */  +  +table.tableblock {  + margin-top: 1.0em;  + margin-bottom: 1.5em;  +}  +thead, p.tableblock.header {  + font-weight: bold;  + color: #527bbd;  +}  +p.tableblock {  + margin-top: 0;  +}  +table.tableblock {  + border-width: 3px;  + border-spacing: 0px;  + border-style: solid;  + border-color: #527bbd;  + border-collapse: collapse;  +}  +th.tableblock, td.tableblock {  + border-width: 1px;  + padding: 4px;  + border-style: solid;  + border-color: #527bbd;  +}  +  +table.tableblock.frame-topbot {  + border-left-style: hidden;  + border-right-style: hidden;  +}  +table.tableblock.frame-sides {  + border-top-style: hidden;  + border-bottom-style: hidden;  +}  +table.tableblock.frame-none {  + border-style: hidden;  +}  +  +th.tableblock.halign-left, td.tableblock.halign-left {  + text-align: left;  +}  +th.tableblock.halign-center, td.tableblock.halign-center {  + text-align: center;  +}  +th.tableblock.halign-right, td.tableblock.halign-right {  + text-align: right;  +}  +  +th.tableblock.valign-top, td.tableblock.valign-top {  + vertical-align: top;  +}  +th.tableblock.valign-middle, td.tableblock.valign-middle {  + vertical-align: middle;  +}  +th.tableblock.valign-bottom, td.tableblock.valign-bottom {  + vertical-align: bottom;  +}  +  +  +/*  + * manpage specific  + *  + * */  +  +body.manpage h1 {  + padding-top: 0.5em;  + padding-bottom: 0.5em;  + border-top: 2px solid silver;  + border-bottom: 2px solid silver;  +}  +body.manpage h2 {  + border-style: none;  +}  +body.manpage div.sectionbody {  + margin-left: 3em;  +}  +  +@media print {  + body.manpage div#toc { display: none; }  +}  +  +  +</style>  +<script type="text/javascript">  +/*<![CDATA[*/  +var asciidoc = { // Namespace.  +  +/////////////////////////////////////////////////////////////////////  +// Table Of Contents generator  +/////////////////////////////////////////////////////////////////////  +  +/* Author: Mihai Bazon, September 2002  + * http://students.infoiasi.ro/~mishoo  + *  + * Table Of Content generator  + * Version: 0.4  + *  + * Feel free to use this script under the terms of the GNU General Public  + * License, as long as you do not remove or alter this notice.  + */  +  + /* modified by Troy D. Hanson, September 2006. License: GPL */  + /* modified by Stuart Rackham, 2006, 2009. License: GPL */  +  +// toclevels = 1..4.  +toc: function (toclevels) {  +  + function getText(el) {  + var text = "";  + for (var i = el.firstChild; i != null; i = i.nextSibling) {  + if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.  + text += i.data;  + else if (i.firstChild != null)  + text += getText(i);  + }  + return text;  + }  +  + function TocEntry(el, text, toclevel) {  + this.element = el;  + this.text = text;  + this.toclevel = toclevel;  + }  +  + function tocEntries(el, toclevels) {  + var result = new Array;  + var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');  + // Function that scans the DOM tree for header elements (the DOM2  + // nodeIterator API would be a better technique but not supported by all  + // browsers).  + var iterate = function (el) {  + for (var i = el.firstChild; i != null; i = i.nextSibling) {  + if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {  + var mo = re.exec(i.tagName);  + if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {  + result[result.length] = new TocEntry(i, getText(i), mo[1]-1);  + }  + iterate(i);  + }  + }  + }  + iterate(el);  + return result;  + }  +  + var toc = document.getElementById("toc");  + if (!toc) {  + return;  + }  +  + // Delete existing TOC entries in case we're reloading the TOC.  + var tocEntriesToRemove = [];  + var i;  + for (i = 0; i < toc.childNodes.length; i++) {  + var entry = toc.childNodes[i];  + if (entry.nodeName.toLowerCase() == 'div'  + && entry.getAttribute("class")  + && entry.getAttribute("class").match(/^toclevel/))  + tocEntriesToRemove.push(entry);  + }  + for (i = 0; i < tocEntriesToRemove.length; i++) {  + toc.removeChild(tocEntriesToRemove[i]);  + }  +  + // Rebuild TOC entries.  + var entries = tocEntries(document.getElementById("content"), toclevels);  + for (var i = 0; i < entries.length; ++i) {  + var entry = entries[i];  + if (entry.element.id == "")  + entry.element.id = "_toc_" + i;  + var a = document.createElement("a");  + a.href = "#" + entry.element.id;  + a.appendChild(document.createTextNode(entry.text));  + var div = document.createElement("div");  + div.appendChild(a);  + div.className = "toclevel" + entry.toclevel;  + toc.appendChild(div);  + }  + if (entries.length == 0)  + toc.parentNode.removeChild(toc);  +},  +  +  +/////////////////////////////////////////////////////////////////////  +// Footnotes generator  +/////////////////////////////////////////////////////////////////////  +  +/* Based on footnote generation code from:  + * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html  + */  +  +footnotes: function () {  + // Delete existing footnote entries in case we're reloading the footnodes.  + var i;  + var noteholder = document.getElementById("footnotes");  + if (!noteholder) {  + return;  + }  + var entriesToRemove = [];  + for (i = 0; i < noteholder.childNodes.length; i++) {  + var entry = noteholder.childNodes[i];  + if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")  + entriesToRemove.push(entry);  + }  + for (i = 0; i < entriesToRemove.length; i++) {  + noteholder.removeChild(entriesToRemove[i]);  + }  +  + // Rebuild footnote entries.  + var cont = document.getElementById("content");  + var spans = cont.getElementsByTagName("span");  + var refs = {};  + var n = 0;  + for (i=0; i<spans.length; i++) {  + if (spans[i].className == "footnote") {  + n++;  + var note = spans[i].getAttribute("data-note");  + if (!note) {  + // Use [\s\S] in place of . so multi-line matches work.  + // Because JavaScript has no s (dotall) regex flag.  + note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];  + spans[i].innerHTML =  + "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +  + "' title='View footnote' class='footnote'>" + n + "</a>]";  + spans[i].setAttribute("data-note", note);  + }  + noteholder.innerHTML +=  + "<div class='footnote' id='_footnote_" + n + "'>" +  + "<a href='#_footnoteref_" + n + "' title='Return to text'>" +  + n + "</a>. " + note + "</div>";  + var id =spans[i].getAttribute("id");  + if (id != null) refs["#"+id] = n;  + }  + }  + if (n == 0)  + noteholder.parentNode.removeChild(noteholder);  + else {  + // Process footnoterefs.  + for (i=0; i<spans.length; i++) {  + if (spans[i].className == "footnoteref") {  + var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");  + href = href.match(/#.*/)[0]; // Because IE return full URL.  + n = refs[href];  + spans[i].innerHTML =  + "[<a href='#_footnote_" + n +  + "' title='View footnote' class='footnote'>" + n + "</a>]";  + }  + }  + }  +},  +  +install: function(toclevels) {  + var timerId;  +  + function reinstall() {  + asciidoc.footnotes();  + if (toclevels) {  + asciidoc.toc(toclevels);  + }  + }  +  + function reinstallAndRemoveTimer() {  + clearInterval(timerId);  + reinstall();  + }  +  + timerId = setInterval(reinstall, 500);  + if (document.addEventListener)  + document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);  + else  + window.onload = reinstallAndRemoveTimer;  +}  +  +}  +asciidoc.install();  +/*]]>*/  +</script>  +</head>  +<body class="article">  +<div id="header">  +<h1>Git signature format</h1>  +</div>  +<div id="content">  +<div class="sect1">  +<h2 id="_overview">Overview</h2>  +<div class="sectionbody">  +<div class="paragraph"><p>Git uses cryptographic signatures in various places, currently objects (tags,  +commits, mergetags) and transactions (pushes). In every case, the command which  +is about to create an object or transaction determines a payload from that,  +calls gpg to obtain a detached signature for the payload (<code>gpg -bsa</code>) and  +embeds the signature into the object or transaction.</p></div>  +<div class="paragraph"><p>Signatures always begin with <code>-----BEGIN PGP SIGNATURE-----</code>  +and end with <code>-----END PGP SIGNATURE-----</code>, unless gpg is told to  +produce RFC1991 signatures which use <code>MESSAGE</code> instead of <code>SIGNATURE</code>.</p></div>  +<div class="paragraph"><p>The signed payload and the way the signature is embedded depends  +on the type of the object resp. transaction.</p></div>  +</div>  +</div>  +<div class="sect1">  +<h2 id="_tag_signatures">Tag signatures</h2>  +<div class="sectionbody">  +<div class="ulist"><ul>  +<li>  +<p>  +created by: <code>git tag -s</code>  +</p>  +</li>  +<li>  +<p>  +payload: annotated tag object  +</p>  +</li>  +<li>  +<p>  +embedding: append the signature to the unsigned tag object  +</p>  +</li>  +<li>  +<p>  +example: tag <code>signedtag</code> with subject <code>signed tag</code>  +</p>  +</li>  +</ul></div>  +<div class="listingblock">  +<div class="content">  +<pre><code>object 04b871796dc0420f8e7561a895b52484b701d51a  +type commit  +tag signedtag  +tagger C O Mitter &lt;committer@example.com&gt; 1465981006 +0000  +  +signed tag  +  +signed tag message body  +-----BEGIN PGP SIGNATURE-----  +Version: GnuPG v1  +  +iQEcBAABAgAGBQJXYRhOAAoJEGEJLoW3InGJklkIAIcnhL7RwEb/+QeX9enkXhxn  +rxfdqrvWd1K80sl2TOt8Bg/NYwrUBw/RWJ+sg/hhHp4WtvE1HDGHlkEz3y11Lkuh  +8tSxS3qKTxXUGozyPGuE90sJfExhZlW4knIQ1wt/yWqM+33E9pN4hzPqLwyrdods  +q8FWEqPPUbSJXoMbRPw04S5jrLtZSsUWbRYjmJCHzlhSfFWW4eFd37uquIaLUBS0  +rkC3Jrx7420jkIpgFcTI2s60uhSQLzgcCwdA2ukSYIRnjg/zDkj8+3h/GaROJ72x  +lZyI6HWixKJkWw8lE9aAOD9TmTW9sFJwcVAzmAuFX2kUreDUKMZduGcoRYGpD7E=  +=jpXa  +-----END PGP SIGNATURE-----</code></pre>  +</div></div>  +<div class="ulist"><ul>  +<li>  +<p>  +verify with: <code>git verify-tag [-v]</code> or <code>git tag -v</code>  +</p>  +</li>  +</ul></div>  +<div class="listingblock">  +<div class="content">  +<pre><code>gpg: Signature made Wed Jun 15 10:56:46 2016 CEST using RSA key ID B7227189  +gpg: Good signature from "Eris Discordia &lt;discord@example.net&gt;"  +gpg: WARNING: This key is not certified with a trusted signature!  +gpg: There is no indication that the signature belongs to the owner.  +Primary key fingerprint: D4BE 2231 1AD3 131E 5EDA 29A4 6109 2E85 B722 7189  +object 04b871796dc0420f8e7561a895b52484b701d51a  +type commit  +tag signedtag  +tagger C O Mitter &lt;committer@example.com&gt; 1465981006 +0000  +  +signed tag  +  +signed tag message body</code></pre>  +</div></div>  +</div>  +</div>  +<div class="sect1">  +<h2 id="_commit_signatures">Commit signatures</h2>  +<div class="sectionbody">  +<div class="ulist"><ul>  +<li>  +<p>  +created by: <code>git commit -S</code>  +</p>  +</li>  +<li>  +<p>  +payload: commit object  +</p>  +</li>  +<li>  +<p>  +embedding: header entry <code>gpgsig</code>  + (content is preceded by a space)  +</p>  +</li>  +<li>  +<p>  +example: commit with subject <code>signed commit</code>  +</p>  +</li>  +</ul></div>  +<div class="listingblock">  +<div class="content">  +<pre><code>tree eebfed94e75e7760540d1485c740902590a00332  +parent 04b871796dc0420f8e7561a895b52484b701d51a  +author A U Thor &lt;author@example.com&gt; 1465981137 +0000  +committer C O Mitter &lt;committer@example.com&gt; 1465981137 +0000  +gpgsig -----BEGIN PGP SIGNATURE-----  + Version: GnuPG v1  +  + iQEcBAABAgAGBQJXYRjRAAoJEGEJLoW3InGJ3IwIAIY4SA6GxY3BjL60YyvsJPh/  + HRCJwH+w7wt3Yc/9/bW2F+gF72kdHOOs2jfv+OZhq0q4OAN6fvVSczISY/82LpS7  + DVdMQj2/YcHDT4xrDNBnXnviDO9G7am/9OE77kEbXrp7QPxvhjkicHNwy2rEflAA  + zn075rtEERDHr8nRYiDh8eVrefSO7D+bdQ7gv+7GsYMsd2auJWi1dHOSfTr9HIF4  + HJhWXT9d2f8W+diRYXGh4X0wYiGg6na/soXc+vdtDYBzIxanRqjg8jCAeo1eOTk1  + EdTwhcTZlI0x5pvJ3H0+4hA2jtldVtmPM4OTB0cTrEWBad7XV6YgiyuII73Ve3I=  + =jKHM  + -----END PGP SIGNATURE-----  +  +signed commit  +  +signed commit message body</code></pre>  +</div></div>  +<div class="ulist"><ul>  +<li>  +<p>  +verify with: <code>git verify-commit [-v]</code> (or <code>git show --show-signature</code>)  +</p>  +</li>  +</ul></div>  +<div class="listingblock">  +<div class="content">  +<pre><code>gpg: Signature made Wed Jun 15 10:58:57 2016 CEST using RSA key ID B7227189  +gpg: Good signature from "Eris Discordia &lt;discord@example.net&gt;"  +gpg: WARNING: This key is not certified with a trusted signature!  +gpg: There is no indication that the signature belongs to the owner.  +Primary key fingerprint: D4BE 2231 1AD3 131E 5EDA 29A4 6109 2E85 B722 7189  +tree eebfed94e75e7760540d1485c740902590a00332  +parent 04b871796dc0420f8e7561a895b52484b701d51a  +author A U Thor &lt;author@example.com&gt; 1465981137 +0000  +committer C O Mitter &lt;committer@example.com&gt; 1465981137 +0000  +  +signed commit  +  +signed commit message body</code></pre>  +</div></div>  +</div>  +</div>  +<div class="sect1">  +<h2 id="_mergetag_signatures">Mergetag signatures</h2>  +<div class="sectionbody">  +<div class="ulist"><ul>  +<li>  +<p>  +created by: <code>git merge</code> on signed tag  +</p>  +</li>  +<li>  +<p>  +payload/embedding: the whole signed tag object is embedded into  + the (merge) commit object as header entry <code>mergetag</code>  +</p>  +</li>  +<li>  +<p>  +example: merge of the signed tag <code>signedtag</code> as above  +</p>  +</li>  +</ul></div>  +<div class="listingblock">  +<div class="content">  +<pre><code>tree c7b1cff039a93f3600a1d18b82d26688668c7dea  +parent c33429be94b5f2d3ee9b0adad223f877f174b05d  +parent 04b871796dc0420f8e7561a895b52484b701d51a  +author A U Thor &lt;author@example.com&gt; 1465982009 +0000  +committer C O Mitter &lt;committer@example.com&gt; 1465982009 +0000  +mergetag object 04b871796dc0420f8e7561a895b52484b701d51a  + type commit  + tag signedtag  + tagger C O Mitter &lt;committer@example.com&gt; 1465981006 +0000  +  + signed tag  +  + signed tag message body  + -----BEGIN PGP SIGNATURE-----  + Version: GnuPG v1  +  + iQEcBAABAgAGBQJXYRhOAAoJEGEJLoW3InGJklkIAIcnhL7RwEb/+QeX9enkXhxn  + rxfdqrvWd1K80sl2TOt8Bg/NYwrUBw/RWJ+sg/hhHp4WtvE1HDGHlkEz3y11Lkuh  + 8tSxS3qKTxXUGozyPGuE90sJfExhZlW4knIQ1wt/yWqM+33E9pN4hzPqLwyrdods  + q8FWEqPPUbSJXoMbRPw04S5jrLtZSsUWbRYjmJCHzlhSfFWW4eFd37uquIaLUBS0  + rkC3Jrx7420jkIpgFcTI2s60uhSQLzgcCwdA2ukSYIRnjg/zDkj8+3h/GaROJ72x  + lZyI6HWixKJkWw8lE9aAOD9TmTW9sFJwcVAzmAuFX2kUreDUKMZduGcoRYGpD7E=  + =jpXa  + -----END PGP SIGNATURE-----  +  +Merge tag 'signedtag' into downstream  +  +signed tag  +  +signed tag message body  +  +# gpg: Signature made Wed Jun 15 08:56:46 2016 UTC using RSA key ID B7227189  +# gpg: Good signature from "Eris Discordia &lt;discord@example.net&gt;"  +# gpg: WARNING: This key is not certified with a trusted signature!  +# gpg: There is no indication that the signature belongs to the owner.  +# Primary key fingerprint: D4BE 2231 1AD3 131E 5EDA 29A4 6109 2E85 B722 7189</code></pre>  +</div></div>  +<div class="ulist"><ul>  +<li>  +<p>  +verify with: verification is embedded in merge commit message by default,  + alternatively with <code>git show --show-signature</code>:  +</p>  +</li>  +</ul></div>  +<div class="listingblock">  +<div class="content">  +<pre><code>commit 9863f0c76ff78712b6800e199a46aa56afbcbd49  +merged tag 'signedtag'  +gpg: Signature made Wed Jun 15 10:56:46 2016 CEST using RSA key ID B7227189  +gpg: Good signature from "Eris Discordia &lt;discord@example.net&gt;"  +gpg: WARNING: This key is not certified with a trusted signature!  +gpg: There is no indication that the signature belongs to the owner.  +Primary key fingerprint: D4BE 2231 1AD3 131E 5EDA 29A4 6109 2E85 B722 7189  +Merge: c33429b 04b8717  +Author: A U Thor &lt;author@example.com&gt;  +Date: Wed Jun 15 09:13:29 2016 +0000  +  + Merge tag 'signedtag' into downstream  +  + signed tag  +  + signed tag message body  +  + # gpg: Signature made Wed Jun 15 08:56:46 2016 UTC using RSA key ID B7227189  + # gpg: Good signature from "Eris Discordia &lt;discord@example.net&gt;"  + # gpg: WARNING: This key is not certified with a trusted signature!  + # gpg: There is no indication that the signature belongs to the owner.  + # Primary key fingerprint: D4BE 2231 1AD3 131E 5EDA 29A4 6109 2E85 B722 7189</code></pre>  +</div></div>  +</div>  +</div>  +</div>  +<div id="footnotes"><hr /></div>  +<div id="footer">  +<div id="footer-text">  +Last updated 2016-07-06 14:33:48 PDT  +</div>  +</div>  +</body>  +</html>  
diff --git a/technical/signature-format.txt b/technical/signature-format.txt new file mode 100644 index 0000000..2c9406a --- /dev/null +++ b/technical/signature-format.txt 
@@ -0,0 +1,186 @@ +Git signature format +==================== + +== Overview + +Git uses cryptographic signatures in various places, currently objects (tags, +commits, mergetags) and transactions (pushes). In every case, the command which +is about to create an object or transaction determines a payload from that, +calls gpg to obtain a detached signature for the payload (`gpg -bsa`) and +embeds the signature into the object or transaction. + +Signatures always begin with `-----BEGIN PGP SIGNATURE-----` +and end with `-----END PGP SIGNATURE-----`, unless gpg is told to +produce RFC1991 signatures which use `MESSAGE` instead of `SIGNATURE`. + +The signed payload and the way the signature is embedded depends +on the type of the object resp. transaction. + +== Tag signatures + +- created by: `git tag -s` +- payload: annotated tag object +- embedding: append the signature to the unsigned tag object +- example: tag `signedtag` with subject `signed tag` + +---- +object 04b871796dc0420f8e7561a895b52484b701d51a +type commit +tag signedtag +tagger C O Mitter <committer@example.com> 1465981006 +0000 + +signed tag + +signed tag message body +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1 + +iQEcBAABAgAGBQJXYRhOAAoJEGEJLoW3InGJklkIAIcnhL7RwEb/+QeX9enkXhxn +rxfdqrvWd1K80sl2TOt8Bg/NYwrUBw/RWJ+sg/hhHp4WtvE1HDGHlkEz3y11Lkuh +8tSxS3qKTxXUGozyPGuE90sJfExhZlW4knIQ1wt/yWqM+33E9pN4hzPqLwyrdods +q8FWEqPPUbSJXoMbRPw04S5jrLtZSsUWbRYjmJCHzlhSfFWW4eFd37uquIaLUBS0 +rkC3Jrx7420jkIpgFcTI2s60uhSQLzgcCwdA2ukSYIRnjg/zDkj8+3h/GaROJ72x +lZyI6HWixKJkWw8lE9aAOD9TmTW9sFJwcVAzmAuFX2kUreDUKMZduGcoRYGpD7E= +=jpXa +-----END PGP SIGNATURE----- +---- + +- verify with: `git verify-tag [-v]` or `git tag -v` + +---- +gpg: Signature made Wed Jun 15 10:56:46 2016 CEST using RSA key ID B7227189 +gpg: Good signature from "Eris Discordia <discord@example.net>" +gpg: WARNING: This key is not certified with a trusted signature! +gpg: There is no indication that the signature belongs to the owner. +Primary key fingerprint: D4BE 2231 1AD3 131E 5EDA 29A4 6109 2E85 B722 7189 +object 04b871796dc0420f8e7561a895b52484b701d51a +type commit +tag signedtag +tagger C O Mitter <committer@example.com> 1465981006 +0000 + +signed tag + +signed tag message body +---- + +== Commit signatures + +- created by: `git commit -S` +- payload: commit object +- embedding: header entry `gpgsig` + (content is preceded by a space) +- example: commit with subject `signed commit` + +---- +tree eebfed94e75e7760540d1485c740902590a00332 +parent 04b871796dc0420f8e7561a895b52484b701d51a +author A U Thor <author@example.com> 1465981137 +0000 +committer C O Mitter <committer@example.com> 1465981137 +0000 +gpgsig -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1 + + iQEcBAABAgAGBQJXYRjRAAoJEGEJLoW3InGJ3IwIAIY4SA6GxY3BjL60YyvsJPh/ + HRCJwH+w7wt3Yc/9/bW2F+gF72kdHOOs2jfv+OZhq0q4OAN6fvVSczISY/82LpS7 + DVdMQj2/YcHDT4xrDNBnXnviDO9G7am/9OE77kEbXrp7QPxvhjkicHNwy2rEflAA + zn075rtEERDHr8nRYiDh8eVrefSO7D+bdQ7gv+7GsYMsd2auJWi1dHOSfTr9HIF4 + HJhWXT9d2f8W+diRYXGh4X0wYiGg6na/soXc+vdtDYBzIxanRqjg8jCAeo1eOTk1 + EdTwhcTZlI0x5pvJ3H0+4hA2jtldVtmPM4OTB0cTrEWBad7XV6YgiyuII73Ve3I= + =jKHM + -----END PGP SIGNATURE----- + +signed commit + +signed commit message body +---- + +- verify with: `git verify-commit [-v]` (or `git show --show-signature`) + +---- +gpg: Signature made Wed Jun 15 10:58:57 2016 CEST using RSA key ID B7227189 +gpg: Good signature from "Eris Discordia <discord@example.net>" +gpg: WARNING: This key is not certified with a trusted signature! +gpg: There is no indication that the signature belongs to the owner. +Primary key fingerprint: D4BE 2231 1AD3 131E 5EDA 29A4 6109 2E85 B722 7189 +tree eebfed94e75e7760540d1485c740902590a00332 +parent 04b871796dc0420f8e7561a895b52484b701d51a +author A U Thor <author@example.com> 1465981137 +0000 +committer C O Mitter <committer@example.com> 1465981137 +0000 + +signed commit + +signed commit message body +---- + +== Mergetag signatures + +- created by: `git merge` on signed tag +- payload/embedding: the whole signed tag object is embedded into + the (merge) commit object as header entry `mergetag` +- example: merge of the signed tag `signedtag` as above + +---- +tree c7b1cff039a93f3600a1d18b82d26688668c7dea +parent c33429be94b5f2d3ee9b0adad223f877f174b05d +parent 04b871796dc0420f8e7561a895b52484b701d51a +author A U Thor <author@example.com> 1465982009 +0000 +committer C O Mitter <committer@example.com> 1465982009 +0000 +mergetag object 04b871796dc0420f8e7561a895b52484b701d51a + type commit + tag signedtag + tagger C O Mitter <committer@example.com> 1465981006 +0000 + + signed tag + + signed tag message body + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1 + + iQEcBAABAgAGBQJXYRhOAAoJEGEJLoW3InGJklkIAIcnhL7RwEb/+QeX9enkXhxn + rxfdqrvWd1K80sl2TOt8Bg/NYwrUBw/RWJ+sg/hhHp4WtvE1HDGHlkEz3y11Lkuh + 8tSxS3qKTxXUGozyPGuE90sJfExhZlW4knIQ1wt/yWqM+33E9pN4hzPqLwyrdods + q8FWEqPPUbSJXoMbRPw04S5jrLtZSsUWbRYjmJCHzlhSfFWW4eFd37uquIaLUBS0 + rkC3Jrx7420jkIpgFcTI2s60uhSQLzgcCwdA2ukSYIRnjg/zDkj8+3h/GaROJ72x + lZyI6HWixKJkWw8lE9aAOD9TmTW9sFJwcVAzmAuFX2kUreDUKMZduGcoRYGpD7E= + =jpXa + -----END PGP SIGNATURE----- + +Merge tag 'signedtag' into downstream + +signed tag + +signed tag message body + +# gpg: Signature made Wed Jun 15 08:56:46 2016 UTC using RSA key ID B7227189 +# gpg: Good signature from "Eris Discordia <discord@example.net>" +# gpg: WARNING: This key is not certified with a trusted signature! +# gpg: There is no indication that the signature belongs to the owner. +# Primary key fingerprint: D4BE 2231 1AD3 131E 5EDA 29A4 6109 2E85 B722 7189 +---- + +- verify with: verification is embedded in merge commit message by default, + alternatively with `git show --show-signature`: + +---- +commit 9863f0c76ff78712b6800e199a46aa56afbcbd49 +merged tag 'signedtag' +gpg: Signature made Wed Jun 15 10:56:46 2016 CEST using RSA key ID B7227189 +gpg: Good signature from "Eris Discordia <discord@example.net>" +gpg: WARNING: This key is not certified with a trusted signature! +gpg: There is no indication that the signature belongs to the owner. +Primary key fingerprint: D4BE 2231 1AD3 131E 5EDA 29A4 6109 2E85 B722 7189 +Merge: c33429b 04b8717 +Author: A U Thor <author@example.com> +Date: Wed Jun 15 09:13:29 2016 +0000 + + Merge tag 'signedtag' into downstream + + signed tag + + signed tag message body + + # gpg: Signature made Wed Jun 15 08:56:46 2016 UTC using RSA key ID B7227189 + # gpg: Good signature from "Eris Discordia <discord@example.net>" + # gpg: WARNING: This key is not certified with a trusted signature! + # gpg: There is no indication that the signature belongs to the owner. + # Primary key fingerprint: D4BE 2231 1AD3 131E 5EDA 29A4 6109 2E85 B722 7189 +----